/* 
    给定n个非负整数表示每个宽度为1的柱子的高度题，计算按此排列的柱子，下雨之后能接多少雨水。
    局部最大值问题
    单调栈：栈底 =》栈顶：单调递减
    对于遍历到的元素，
    小于栈顶，入栈
    等于栈顶：遇到相同的元素，更新栈内下标，就是将栈里元素（旧下标）弹出，将新元素（新下标）加入栈中。
    大于栈顶

*/
function volume(height) {
    //
    let stack = [];
    let sum = 0;
    stack.push(0);
    for (let index = 1; index < height.length; index++) {
        const element = height[index];
        console.log(height[index], height[stack[stack.length - 1]]);
        if (height[index] < height[stack[stack.length - 1]]) {
            stack.push(index);
        } else if (height[index] === height[stack[stack.length - 1]]) {
            stack.pop();
            stack.push(index);
        } else {
            // 形成凹陷，可以存储水资源
            while (height[index] > height[stack[stack.length - 1]] && stack.length > 0) {
                let temp = stack.pop();
                if (stack.length <= 0) break;
                let h = Math.min(height[index], height[stack[stack.length - 1]]) - height[temp];
                sum += h * (index - stack[stack.length - 1] - 1);
            }
            stack.push(index);
        }
    }
    return sum;
}
let h = [0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1];
console.log(volume(h));
